package com.yyge.common.util;

import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 反射工具类
 */

@Component
public class ReflectionUtil {
    /**
     * 获取一个类中所有不为空的属性名称
     * @param obj 提供类Calss
     * @return 返回 List<Field>
     */
    public List<Field> getFieldNames(Object obj) {
        List<Field> fieldNames = new ArrayList<>();

        // 获取类的所有字段
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            try {
                // 设置访问权限，可以访问私有字段
                field.setAccessible(true);
                // 判断字段值是否为空
                if (field.get(obj) != null) {
                    fieldNames.add(field);  // 将不为空的属性名称添加到列表中
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return fieldNames;
    }

    /**
     * 判断一个方法是否包含某个参数
     * @param method 方法
     * @param args 参数字符串
     * @return 布尔
     */
    public boolean isContainsArgs(Method method,String args){
        //获取方法所有的参数
        Class<?>[] types = method.getParameterTypes();
        for (Class<?> type : types) {
            System.out.println(type.getSimpleName()+"==="+args);
            if(type.getSimpleName().equals(args)){
              return true;
            }
        }
        return false;
    }

    /**
     * 获取一个类中包含某个参数的方法
     * @param object 类(calss)
     * @param args 参数(String)
     * @return Method方法
     */
    public Method isContainsArgs(Class<?> object,String args){
        //获取类中所有的方法参数
        Method[] methods = object.getDeclaredMethods();
        for (Method method : methods) {
            if(isContainsArgs(method,args)){
                return method;
            };
        }
        return null;
    }
}
